🏃♂️ API de Atletas - Documentação Completa
📋 Visão Geral
A API de Atletas é responsável por toda a gestão de atletas no sistema CordenaAi, incluindo cadastro, atualização, consulta, relacionamento com responsáveis e equipes, além de funcionalidades específicas como pesquisa e gerenciamento de mensagens.
🎯 Endpoints Disponíveis
1. GET /api/Atletas
Obter Lista de Atletas
- Descrição: Retorna uma lista completa de todos os atletas cadastrados no sistema
- Método: GET
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros: Nenhum
- Resposta: Array de objetos Atleta
- Uso: Utilizado em dashboards administrativos, relatórios e listagens gerais
2. POST /api/Atletas
Criar Novo Atleta
- Descrição: Cria um novo atleta no sistema
- Método: POST
- Autenticação: Requerida (JWT Bearer Token)
- Body: Objeto Atleta com dados obrigatórios
- Resposta: Objeto Atleta criado com ID gerado
- Uso: Formulários de cadastro de novos atletas
3. GET /api/Atletas/responsavel/{identificador}
Obter Atletas por Responsável
- Descrição: Retorna todos os atletas associados a um responsável específico
- Método: GET
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
identificador (path): ID ou identificador único do responsável
- Resposta: Array de objetos Atleta
- Uso: Interface do responsável para visualizar seus atletas
4. GET /api/Atletas/{id}
Obter Atleta por ID
- Descrição: Retorna os dados completos de um atleta específico
- Método: GET
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
id (path): ID único do atleta
- Resposta: Objeto Atleta completo
- Uso: Visualização de perfil individual, edição de dados
5. PUT /api/Atletas/{id}
Atualizar Atleta
- Descrição: Atualiza os dados de um atleta existente
- Método: PUT
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
id (path): ID único do atleta
- Body: Objeto Atleta com dados atualizados
- Resposta: Objeto Atleta atualizado
- Uso: Formulários de edição de atletas
6. GET /api/Atletas/pesquisar
Pesquisar Atletas
- Descrição: Realiza busca de atletas com base em critérios específicos
- Método: GET
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros: Query parameters para filtros de busca
- Resposta: Array de objetos Atleta que correspondem aos critérios
- Uso: Funcionalidade de busca e filtros avançados
7. GET /api/Atletas/equipe/{equipeId}
Obter Atletas por Equipe
- Descrição: Retorna todos os atletas pertencentes a uma equipe específica
- Método: GET
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
equipeId (path): ID único da equipe
- Resposta: Array de objetos Atleta da equipe
- Uso: Gestão de equipes, relatórios por equipe
8. POST /api/Atletas/cadastrar
Cadastrar Atleta (Endpoint Específico)
- Descrição: Endpoint específico para cadastro de atletas com validações adicionais
- Método: POST
- Autenticação: Requerida (JWT Bearer Token)
- Body: Objeto Atleta com dados de cadastro
- Resposta: Objeto Atleta cadastrado
- Uso: Formulários de cadastro com validações específicas
9. PUT /api/Atletas/atualizar/{alunoId}
Atualizar Atleta por ID de Aluno
- Descrição: Atualiza dados de atleta usando o ID de aluno como referência
- Método: PUT
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
alunoId (path): ID do aluno/atleta
- Body: Objeto Atleta com dados atualizados
- Resposta: Objeto Atleta atualizado
- Uso: Integração com sistemas externos que usam ID de aluno
10. GET /api/Atletas/mensagens/{id}
Obter Mensagens do Atleta
- Descrição: Retorna todas as mensagens associadas a um atleta específico
- Método: GET
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
id (path): ID único do atleta
- Resposta: Array de objetos Mensagem
- Uso: Histórico de comunicação, notificações
11. POST /api/Atletas/{id}/inativar
Inativar Atleta
- Descrição: Inativa um atleta no sistema (soft delete)
- Método: POST
- Autenticação: Requerida (JWT Bearer Token)
- Parâmetros:
id (path): ID único do atleta
- Resposta: Confirmação de inativação
- Uso: Remoção de atletas sem exclusão permanente
⚡ Operações em Massa
12. POST /api/Atletas/mover-em-massa
Mover Múltiplos Atletas Entre Turmas
- Descrição: Move múltiplos atletas de uma turma para outra em uma única operação transacional
- Método: POST
- Autenticação: Requerida (JWT Bearer Token)
- Permissão: Professor ou Administrador
- Body:
{
"usuarioIds": ["id1", "id2", "id3"],
"turmaAtualId": 5,
"turmaDestinoId": 9,
"papelNaTurma": 2,
"horarioId": 12
}
- Resposta:
{
"totalProcessados": 3,
"totalSucesso": 3,
"totalErros": 0,
"detalhes": [...]
}
- Comportamento:
- Inativa automaticamente todos os horários da turma atual (status = 0 - soft delete)
- Inativa o vínculo da turma atual e cria novo vínculo na turma destino
- Opcionalmente associa a um novo horário (se
horarioId for informado)
- Opcionalmente muda o papel na turma (se
papelNaTurma for informado)
- Uso: Remanejamento de atletas entre turmas, reorganização de grupos
13. POST /api/Atletas/remover-em-massa
Remover Múltiplos Atletas de uma Turma
- Descrição: Remove múltiplos atletas de uma turma específica (soft delete - status = 0 da associação)
- Método: POST
- Autenticação: Requerida (JWT Bearer Token)
- Permissão: Professor ou Administrador
- Body:
{
"usuarioIds": ["id1", "id2"],
"turmaId": 5
}
- Resposta:
{
"totalProcessados": 2,
"totalSucesso": 2,
"totalErros": 0,
"detalhes": [...]
}
- Comportamento:
- Inativa o vínculo UsuarioTurma (status = 0 - soft delete)
- Inativa TODOS os horários dessa turma para o usuário (status = 0 - soft delete)
- O usuário continua existindo no sistema (não é deletado)
- Os registros são mantidos no banco de dados com status = 0 para auditoria e possível restauração
- Uso: Desvinculação de atletas de turmas, limpeza de associações
👥 Sistema de Papéis
Conceitos Fundamentais
O sistema utiliza dois tipos distintos de papéis para gerenciar permissões e funções:
1. PapelNaTurma - Papel do Usuário na Turma
Define a identidade/cargo geral que um usuário tem dentro de uma turma específica.
| Valor |
Nome |
Descrição |
| 1 |
Aluno |
Estudante regular da turma |
| 2 |
Atleta |
Atleta/estudante esportivo |
| 3 |
Professor |
Professor responsável pela turma |
| 4 |
Monitor |
Monitor/auxiliar estudante |
2. PapelId (HorarioUsuario) - Papel no Horário
Define a função operacional que um usuário tem dentro de um horário específico (aula/treino).
| Valor |
Nome |
Função |
| 1 |
Auxiliar |
Quem auxilia na aula ou treino |
| 2 |
Professor |
Quem conduz/ministra a aula ou treino |
| 3 |
Aluno/Atleta |
Quem participa/assiste a aula ou treino |
Mapeamento entre PapelNaTurma e PapelId
Quando um atleta é vinculado a um horário, o sistema mapeia automaticamente o papel da turma para o papel do horário:
| PapelNaTurma (Turma) |
Valor |
→ |
PapelId (Horário) |
Valor |
Lógica |
| Aluno |
1 |
→ |
Aluno/Atleta |
3 |
Quem aprende/participa |
| Atleta |
2 |
→ |
Aluno/Atleta |
3 |
Quem treina/participa |
| Professor |
3 |
→ |
Professor |
2 |
Quem ensina/conduz |
| Monitor |
4 |
→ |
Auxiliar |
1 |
Quem auxilia/monitora |
📌 Definição do Enum PapelNaTurma
Localização: InMinds.CordenaAi.Api/Modules/Hierarquia/Models.cs
public enum PapelNaTurma
{
Aluno = 1,
Atleta = 2,
Professor = 3,
Monitor = 4
}
Exemplo Prático
Cenário: Mover João (Atleta) para nova turma com horário
POST /api/Atletas/mover-em-massa
Content-Type: application/json
Authorization: Bearer {token}
{
"usuarioIds": ["joao-id"],
"turmaAtualId": 5,
"turmaDestinoId": 9,
"papelNaTurma": 2,
"horarioId": 12
}
Resultado:
- João É um Atleta (PapelNaTurma = 2) na Turma 9
- No horário 12, João PARTICIPA COMO Aluno/Atleta (PapelId = 3) ✅
- Mapeamento automático:
PapelNaTurma.Atleta (2) → PapelId 3
📊 Cenários de Mapeamento
Cenário 1: papelNaTurma = 1 (Aluno)
{
"usuarioIds": ["joao-id"],
"turmaAtualId": 5,
"turmaDestinoId": 9,
"papelNaTurma": 1,
"horarioId": 12
}
Resultado:
- UsuarioTurmas:
papelNaTurma = 1 (Aluno)
- HorarioUsuarios:
papelId = 3 (Aluno/Atleta)
- Lógica: Quem aprende/participa
Cenário 2: papelNaTurma = 2 (Atleta)
{
"usuarioIds": ["maria-id"],
"turmaAtualId": 5,
"turmaDestinoId": 9,
"papelNaTurma": 2,
"horarioId": 12
}
Resultado:
- UsuarioTurmas:
papelNaTurma = 2 (Atleta)
- HorarioUsuarios:
papelId = 3 (Aluno/Atleta)
- Lógica: Quem treina/participa
Cenário 3: papelNaTurma = 3 (Professor)
{
"usuarioIds": ["carlos-id"],
"turmaAtualId": 5,
"turmaDestinoId": 9,
"papelNaTurma": 3,
"horarioId": 12
}
Resultado:
- UsuarioTurmas:
papelNaTurma = 3 (Professor)
- HorarioUsuarios:
papelId = 2 (Professor)
- Lógica: Quem ensina/conduz
⚠️ Observações Importantes
- PapelNaTurma = "O que você É na turma" (identidade/cargo)
- PapelId = "O que você FAZ no horário" (função operacional)
- O mapeamento é feito automaticamente pelo sistema
- Um mesmo usuário pode ter diferentes papéis em diferentes contextos
- Todas as operações em massa utilizam transações para garantir consistência
- A conversão de
PapelNaTurma para PapelId NÃO é direta - utiliza função de mapeamento específica
🔧 Modelo de Dados
Estrutura do Atleta
{
"id": "string",
"nome": "string",
"dataNascimento": "datetime",
"cpf": "string",
"rg": "string",
"email": "string",
"telefone": "string",
"endereco": {
"logradouro": "string",
"numero": "string",
"complemento": "string",
"bairro": "string",
"cidade": "string",
"estado": "string",
"cep": "string"
},
"responsavelId": "string",
"equipeId": "string",
"status": "string",
"dataCadastro": "datetime",
"dataAtualizacao": "datetime"
}
🔐 Autenticação e Autorização
Todos os endpoints requerem:
- JWT Bearer Token no header
Authorization
- Permissões específicas baseadas no tipo de usuário:
- Administradores: Acesso completo a todos os endpoints
- Responsáveis: Acesso limitado aos seus atletas
- Professores: Acesso aos atletas de suas turmas
- Monitores: Acesso aos atletas de suas turmas
📊 Casos de Uso Principais
1. Cadastro de Atletas
POST /api/Atletas/cadastrar
Content-Type: application/json
Authorization: Bearer {token}
{
"nome": "João Silva",
"dataNascimento": "2010-05-15",
"cpf": "123.456.789-00",
"email": "[email protected]",
"responsavelId": "resp-123"
}
2. Busca de Atletas por Responsável
GET /api/Atletas/responsavel/resp-123
Authorization: Bearer {token}
3. Atualização de Dados
PUT /api/Atletas/atleta-456
Content-Type: application/json
Authorization: Bearer {token}
{
"nome": "João Silva Santos",
"telefone": "(11) 99999-9999"
}
4. Pesquisa Avançada
GET /api/Atletas/pesquisar?nome=João&equipe=equipe-789&status=ativo
Authorization: Bearer {token}
5. Movimentação em Massa
POST /api/Atletas/mover-em-massa
Content-Type: application/json
Authorization: Bearer {token}
{
"usuarioIds": ["atleta-1", "atleta-2", "atleta-3"],
"turmaAtualId": 5,
"turmaDestinoId": 9,
"papelNaTurma": 2,
"horarioId": 12
}
Casos de uso:
- Remanejamento de atletas entre turmas ao final de semestre
- Reorganização de grupos por nível/categoria
- Transferência de atletas entre modalidades
- Migração de atletas para novas turmas com horários específicos
6. Remoção em Massa
POST /api/Atletas/remover-em-massa
Content-Type: application/json
Authorization: Bearer {token}
{
"usuarioIds": ["atleta-1", "atleta-2"],
"turmaId": 5
}
Casos de uso:
- Desvinculação de atletas que mudaram de escola/instituição
- Limpeza de turmas ao final do período letivo
- Remoção de atletas que foram transferidos para outras equipes
- Correção de associações incorretas em lote
⚠️ Validações e Regras de Negócio
Validações - Operações em Massa
Mover em Massa
- usuarioIds: Lista não pode ser vazia
- turmaAtualId: Deve ser diferente de turmaDestinoId
- turmaDestinoId: Turma deve existir no sistema
- horarioId (opcional): Se informado, deve pertencer à turmaDestinoId
- papelNaTurma (opcional): Se informado, deve ser um valor válido do enum (1-4)
- Usuário: Deve existir na turma atual para ser movido
- Permissão: Requer TipoUsuarioId 2 (Professor) ou 6 (Admin)
Remover em Massa
- usuarioIds: Lista não pode ser vazia
- turmaId: Turma deve existir no sistema
- Permissão: Requer TipoUsuarioId 2 (Professor) ou 6 (Admin)
- Transação: Se um erro ocorrer, todas as operações são revertidas (rollback)
Validações Obrigatórias - Cadastro
- Nome: Obrigatório, mínimo 2 caracteres
- Data de Nascimento: Obrigatória, formato válido
- CPF: Obrigatório, formato válido, único no sistema
- Email: Formato válido, único no sistema
- Responsável: Deve existir no sistema
Regras de Negócio
- Idade mínima: 5 anos
- Idade máxima: 18 anos
- Status: ativo, inativo, suspenso
- Soft Delete: Atletas inativados não são excluídos permanentemente
- Auditoria: Todas as operações são logadas
🚨 Tratamento de Erros
Códigos de Status HTTP
- 200: Sucesso
- 201: Criado com sucesso
- 400: Dados inválidos
- 401: Não autorizado
- 403: Acesso negado
- 404: Atleta não encontrado
- 409: Conflito (CPF/Email já existente)
- 500: Erro interno do servidor
Formato de Erro
{
"error": "string",
"message": "string",
"details": "string",
"timestamp": "datetime"
}
📈 Performance e Limitações
Limitações
- Paginação: Listas retornam máximo 100 registros por página
- Rate Limiting: 1000 requests por hora por usuário
- Timeout: 30 segundos por requisição
Otimizações
- Cache: Dados de atletas são cacheados por 5 minutos
- Índices: Busca otimizada por CPF, email e nome
- Compressão: Respostas comprimidas com gzip
🔄 Integração com Outros Módulos
Módulos Relacionados
- Responsáveis: Associação obrigatória
- Equipes: Associação opcional
- Mensagens: Histórico de comunicação
- Pagamentos: Dados para cobrança
- Relatórios: Dados para análises
📱 Uso em Aplicações
Web App
- Dashboard administrativo
- Formulários de cadastro/edição
- Relatórios e listagens
Mobile App
- Visualização de atletas por responsável
- Notificações e mensagens
- Atualização de dados básicos
- Operações em massa: Remanejamento de atletas entre turmas
- Gestão de horários e turmas em lote
🛠️ Manutenção e Monitoramento
Logs Importantes
- Criação de novos atletas
- Atualizações de dados sensíveis
- Tentativas de acesso não autorizado
- Erros de validação
- Operações em massa: Movimentações e remoções em lote
- Transações revertidas (rollback) por erros
Métricas Monitoradas
- Número de atletas cadastrados
- Taxa de sucesso das operações
- Tempo de resposta dos endpoints
- Uso de recursos por endpoint
📚 Exemplos Práticos
Fluxo Completo de Cadastro
- Validação de dados no backend pela própria API
- POST /api/Atletas/cadastrar com dados validados
- Associação automática com responsável
- Envio de notificação para responsável
- Criação de perfil no sistema
Fluxo de Busca e Filtros
- GET /api/Atletas/pesquisar com parâmetros
- Aplicação de filtros no backend
- Retorno paginado dos resultados
- Cache dos resultados para próximas buscas
Fluxo de Movimentação em Massa
- Validação de permissões: Verificar se usuário é Professor ou Admin
- Validação de turmas: Verificar se turmas existem e são diferentes
- Início de transação: Garantir atomicidade da operação
- Para cada atleta:
- Verificar se está na turma atual
- Remover horários da turma atual
- Persistir exclusão (SaveChanges)
- Remover da turma atual
- Adicionar na turma destino
- Se horarioId informado: mapear papel e adicionar ao horário
- Commit da transação: Persistir todas as alterações
- Retorno: Detalhamento de sucessos e erros por atleta
Versão: 1.1
Última Atualização: Novembro de 2025
Responsável: Equipe de Desenvolvimento CordenaAi